Map2d = Map2d or Class("Map2d")

function Map2d:ctor(cols, rows)
    self.cols = cols or 0
    self.rows = rows or 0
    self._map = {}
end

function Map2d:set(x, y, v)
    if not self._map[x] then
        self._map[x] = {}
    end
    self._map[x][y] = v
    if x > self.cols then
        self.cols = x
    end
    if y > self.rows then
        self.rows = y
    end
end

function Map2d:get(x, y)
    if not self._map[x] then
        return nil
    end
    return self._map[x][y]
end

function Map2d:map(fn)
    for i = 1, self.cols do
        for j = 1, self.rows do
            if fn(i, j, self:get(i, j)) then
                break
            end
        end
    end
end